#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>

using namespace std;

struct pi
{
	int left, right;

	pi(){}
	pi(int l, int r) :left(l), right(r) {}
};

struct D_Node
{
	char ch[3];
	int in_deg, out_deg, deg;
};

class DD
{
public:
	DD(){}
	//DD(int** arr, D_Node* dn) :arr(arr), dn(dn) {};
	DD(int n):n(n){}
	~DD(){}

	int strcmp(const char* str1, const char* str2)
	{
		while (*str1 == *str2)
		{
			if (*str1 == '\0')
				return 0;
			str1++;
			str2++;
		}
		return *str1 - *str2;
	}

	void make_DD()
	{
		
		//cin >> n;
		arr = new int* [n];
		for (int i = 0; i < n; i++)
		{
			arr[i] = new int[n];
		}
		//memset(arr, 0, sizeof(int) * n * n);
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				arr[i][j] = 0;
			}
			
		}
		//ch = new char[n];
		dn = new D_Node[n];
		for (int i = 0; i < n; i++)
		{
			//cin >> ch[i];
			//cin >> dn[i].ch;
			scanf("%s", dn[i].ch);
			//memset(dn[i].ch, '\0', 3);
			dn[i].deg = dn[i].in_deg = dn[i].out_deg = 0;
		}

		cin >> m;
		//p = new pi[m];
		for (int i = 0; i < m; i++)
		{
			char a[3], b[3];
			//memset(a, '\0', 3);
			//memset(b, '\0', 3);
			//cin >> a >> b;
			scanf("%s%s", a, b);
			int row = 0, col = 0;
			for (int i = 0; i < n; i++)
			{
				if (strcmp(dn[i].ch, a) == 0)
				{
					row = i;
					dn[i].out_deg++;
					//dn[i].deg++;
				}
				if (strcmp(dn[i].ch, b) == 0)
				{
					col = i;
					dn[i].in_deg++;
					//dn[i].deg++;
				}
			}
			arr[row][col] = 1;

		}

		for (int i = 0; i < n; i++)
		{
			dn[i].deg = dn[i].in_deg + dn[i].out_deg;
		}

	}

	void print()
	{
		make_DD();
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				cout << arr[i][j] << ' ';
			}
			cout << endl;
		}
		for (int i = 0; i < n; i++)
		{
			if (dn[i].deg)
				cout << dn[i].ch << ": " << dn[i].out_deg <<' ' << dn[i].in_deg<<' ' << dn[i].deg << endl;
			else
				cout << dn[i].ch << endl;
		}
	}
	
private:
	int** arr;
	int n, m;
	//char* ch;

	//pi* p;
	D_Node* dn;
};

class UD
{
public:
	UD(){}
	UD(int n) :n(n) {}

	~UD(){}

int strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

	void make_DD()
	{

		//cin >> n;
		arr = new int* [n];
		for (int i = 0; i < n; i++)
		{
			arr[i] = new int[n];
		}
		//memset(arr, 0, sizeof(int) * n * n);
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				arr[i][j] = 0;
			}

		}
		//ch = new char[n];
		dn = new D_Node[n];
		for (int i = 0; i < n; i++)
		{
			//cin >> ch[i];
			//cin >> dn[i].ch;
			scanf("%s", dn[i].ch);
			//memset(dn[i].ch, '\0', 3);
			dn[i].deg = dn[i].in_deg = dn[i].out_deg = 0;
		}

		cin >> m;
		//p = new pi[m];
		for (int i = 0; i < m; i++)
		{
			char a[3], b[3];
			//memset(a, '\0', 3);
			//memset(b, '\0', 3);
			//cin >> a >> b;
			scanf("%s%s", a, b);
			int row = 0, col = 0;
			for (int i = 0; i < n; i++)
			{
				if (strcmp(dn[i].ch, a) == 0)
				{
					row = i;
					dn[i].out_deg++;
					//dn[i].deg++;
				}
				if (strcmp(dn[i].ch, b) == 0)
				{
					col = i;
					dn[i].in_deg++;
					//dn[i].deg++;
				}
			}
			arr[row][col] = 1;
			arr[col][row] = 1;
		}

		for (int i = 0; i < n; i++)
		{
			dn[i].deg = dn[i].in_deg + dn[i].out_deg;
		}

	}

	void print()
	{
		make_DD();
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				cout << arr[i][j] << ' ';
			}
			cout << endl;
		}
		for (int i = 0; i < n; i++)
		{
			if (dn[i].deg)
				cout << dn[i].ch << ": " << dn[i].deg << endl;
			else
				cout << dn[i].ch << endl;
		}
	}
private:
	int** arr;
	int n, m;
	//char* ch;

	//pi* p;
	D_Node* dn;
};



void test4()
{
	int t, n;
	char ch;
	cin >> t;
	while (t--)
	{
		cin >> ch >> n;
		if (ch == 'D')
		{
			DD dd(n);
			dd.print();
		}
		else
		{
			UD ud(n);
			ud.print();
		}
	}
}

int main()
{
	test4();
	return 0;
}
